AWS IoT Coreで受け取ったデバイスデータをAmazon DynamoDBに保存してみた

AWS IoT Coreで受け取ったデバイスデータをAmazon DynamoDBに保存してみた

AWS IoT Coreで受け取ったIoTデバイスのデータを、Amazon DynamoDBに格納します。IoT CoreルールでSQLのクエリを設定することで、簡単にDynamoDBにJSONデータを送信することができます。
Clock Icon2024.07.30

IoTデバイスデータを保存したい

おのやんです。

みなさん、IoTデバイスから送信されるデータをデータベースに保存したいと思ったことはありませんか?私はあります。

AWSには、IoTデバイスをAWSと接続して簡単にデータがやりとりできるAWS IoT Core(以下、IoT Core)というサービスがあります。IoT Coreを経由すれば、IoTデバイスから送信されたデバイスデータをAWSの他のサービスに受け渡すことができます。

今回は、IoTデバイスからIoT Coreに送信されたデータをAmazon DynamoDB(以下、DynamoDB)に保存する機会がありましたので、そのやり方などをまとめていきたいと思います。

構成

今回はこちらのシンプルな構成で進めます。IoT Coreに接続したデバイスからIoT Core に向けてデバイスデータが送信されてきます。このデータをIoT Coreのルールでクエリし、DymanoDBに格納します。

architecture

デバイスデータの構造

IoTデバイスから送信されるデータは、今回このような構造になっています。各キーは、検証用のためチュートリアルで紹介されているデータを流用させてもらいます。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-ddb-rule.html

{
  "TEMPERATURE": 28,
  "HUMIDITY": 80,
  "BAROMETER": 1013,
}

また、IoTデバイスのトピックに関しては、device-0001/pubの形を取っています。ですので、IoTデバイスのデータをIoT Core側で受け取ると、このようなメッセージが表示されます。

message_payload

この状態から、以下のJSONデータに整形してDynamoDBに格納したいと思います。

{
  "deviceId": "device-0001",
  "timestamp": "1722238795"
  "temperature": 28,
  "humidity": 80,
  "barometer": 1013,
}

DynamoDBテーブルの作成

まずはデバイスデータを格納するDynamoDBテーブルを作成します。各項目の値は以下の通りです。テール部設定の部分は、今回は特別な要件は必要ないのでデフォルト設定で進めます

項目 備考
テーブル名 aws-test-device-data
パーティションキー deviceId 文字列型
ソートキー timestamp 数値型
テーブル設定 デフォルト設定

create_dynamodb_table

このように、作成したDynamoDBテーブルがアクティブになればOKです。

already_created_dynamodb_table

IoT Coreルールの作成

次に、IoT Coreで受け取ったデバイスデータをDynamoDB用にクエリするIoT Coreルールを作成します。

create_iot_core_rule

最初の画面では、以下の項目を設定します。

項目 備考
ルール名 aws_test_device_data_query_rule -(ハイフン)が使えないため、_(アンダースコア)を使用
説明 IoT Coreで受信したデバイスデータを
DynamoDBに保存する

iot_core_rule_description

次に、SQL設定画面でSQL文を設定します。

今回、デバイスIDはデーバイスデータではなくトピックから取得できるため、IoT Core組み込み関数のtopic()を使ってdeviceIdとしてクエリしています。たとえば、device-0001/sub/pubのトピック名だった場合、topic(1)device-0001topic(2)subが取得できます。

https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-sql-functions.html

またDynamoDBで将来TTLを設定したい時に、TTLで指定するtimestampデータの単位を秒に合わせる必要があるので、ミリ秒で取得しているtimestampFLOOR(timestamp() / 1000)で秒に変換しています。

SELECT
  topic(1) AS deviceId,
  timestamp() AS timestamp,
  TEMPERATURE AS temperature,
  HUMIDITY AS humidity,
  BAROMETER AS barometer,
FROM
  'device-0001/pub'

sql_query

次の画面では、SQLでクエリしたデータを使って発火させるアクションを設定します。今回はDynamoDBのテーブルにデータを入れたいため、DynamoDBv2を選択します。

iot_core_rule_action

また、IoT CoreからDynamoDBテーブルへの書き込み処理をIAMで許可する必要があるので、「新しいロールを作成」から作成します。

create_new_iam_role

動作確認

それでは、実際にデバイスデータがDynamoDBに送信されているか確認しましょう。

IoT Coreのナビゲーションバーに「MQTT テストクライアント」の項目があるので、こちらをクリックします。ここでトピックのフィルターにdevice-0001/pub、メッセージペイロードにさきほどのデバイスデータを入力して、「発行」ボタンをクリックします。入力したメッセージペイロードは変わらないので、何回か「発行ボタン」をクリックすると、同様のデータが下部にどんどん表示されます。

publish_device_data

DynamoDBテーブル内のデータは、DynamoDB画面のナビゲーションバーにある「項目を探索」から確認できます。さきほどのメッセージペイロードで何回か発行したデータが、すべてDynamoDBテーブルに保存されていることが確認できます。

storing_data_in_dynamodb

IoT Coreで簡単にデータをやり取りできる

一般的に複雑な処理になりがちなIoTデバイスデータの処理ですが、IoT Coreを通すことで AWS上で簡単にデータのやり取りができます。

IoT Core経由でDynamoDBにデータを保存する際に、本記事が参考になれば幸いです。では!

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.